Separando os dados

Vou separa os dados por ciclos (quantidade de vezes que o arco elétrico passou pelos eletrodos) para poder filtrar os melhores dados descartando as vezes que o arco não correu totalmente os eletrodos.

Para isto, pretendo calcular a distância entre todos os pontos e, sendo esta distância maior ou menor do que o comprimento dos eletrodos, vou classificar como sendo um novo ciclo ou não.

Porém, primeiramente quero determinar qual a melhor distância para utilizar como critério de seleção (ou seja, qual a distância média percorrida pelo arco elétrico nos eletrodos). Então, vou calcular as distâncias entre os pontos e fazer histogramas para visualizar a frequencia de distribuição dessas distâncias.


In [8]:
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
import os

#Mudar a localização da pasta
#os.chdir('/home/glauffer/Dropbox/Research/Plasma/')

#Ler os dados como arrays
teste1 = np.array(np.loadtxt('/home/glauffer/Dropbox/Research/Plasma/dados/tempo_posicao/1teste_b17a45_manual_completo.txt'))
teste2 = np.array(np.loadtxt('/home/glauffer/Dropbox/Research/Plasma/dados/tempo_posicao/2teste_b22a45_manual_completo.txt'))
teste3 = np.array(np.loadtxt('/home/glauffer/Dropbox/Research/Plasma/dados/tempo_posicao/3teste_b17a55_manual_completo.txt'))
teste4 = np.array(np.loadtxt('/home/glauffer/Dropbox/Research/Plasma/dados/tempo_posicao/4teste_b22a55_manual_completo.txt'))
teste5 = np.array(np.loadtxt('/home/glauffer/Dropbox/Research/Plasma/dados/tempo_posicao/5teste_b17a45_manual_completo.txt'))
#plt.plot(teste2.T[0], teste2.T[1])

In [9]:
#Funcao para calcular o modulo da distancia entre os pontos
def dist_module(data):
	'''
	Calcula o modulo da distancia entre os pontos
	'''
	pos_y = data.T[1] #utiliza apenas os dados em Y (posicao)
	delta = np.zeros(pos_y.size-1)
	for i in range(delta.size):
		delta[i] = abs(pos_y[i+1]-pos_y[i])
    
	#offset = meann*delta.mean() + stdd*delta.std()
	#delta_max = np.zeros(delta.size)
	#for i in range(delta.size):
		#if delta[i] > offset:
			#delta_max[i] = delta[i]
        
	#masked_delta_max = np.ma.masked_equal(delta_max, 0.0, copy=False)
	return delta

In [45]:
#Calcular as distancias entre os pontos para todos os dados
dist1 = dist_module(teste1)
dist2 = dist_module(teste2)
dist3 = dist_module(teste3)
dist4 = dist_module(teste4)
dist5 = dist_module(teste5)

#Vou plotar as distancias de um dos dados para fazer uma analise

dist1_std = np.std(dist1)*np.ones(dist1.size)
plt.plot(dist1, 'bo', dist1_std, 'r--', dist1, 'b-', ms=3)


Out[45]:
[<matplotlib.lines.Line2D at 0x7f9134ca8e80>,
 <matplotlib.lines.Line2D at 0x7f9134caf208>,
 <matplotlib.lines.Line2D at 0x7f9134cafa90>]

Podemos perceber pelo grafico acima que quando ocorre um pico no modulo da distancia significa que ocorre um novo ciclo. A faixa tracejada em vermelho é o desvio padrão dos dados. Existem alguns pontos acima da linha que estão muito perto do desvio padrão, então nao podemos utiliza o desvio como criterio. Vou subtrair os dados pelo desvio para analisar o grafico


In [46]:
res1 = dist1 - dist1_std
plt.plot(res1, 'ko', dist1_std, 'r--', res1, 'k-', ms=3)


Out[46]:
[<matplotlib.lines.Line2D at 0x7f9134c09550>,
 <matplotlib.lines.Line2D at 0x7f9134c09898>,
 <matplotlib.lines.Line2D at 0x7f9134c0f160>]

Agora podemos perceber que há uma maior distancia entre os pontos acima da linha tracejada. Vou utilizar como critério este residuo (dados - desvio padrao), sendo que se a distancia entre os pontos for menor que este residuo, continua como o mesmo ciclo, porem, se a distancia for maior que o residuo, temos um ciclo novo.

Vou fazer gráfico para os residuos e desvio padrao para os outros dados para confirmar essa ideia.


In [43]:
dist2_std = np.std(dist2)*np.ones(dist2.size)
dist3_std = np.std(dist3)*np.ones(dist3.size)
dist4_std = np.std(dist4)*np.ones(dist4.size)
dist5_std = np.std(dist5)*np.ones(dist5.size)
res2 = dist2 - dist2_std
res3 = dist3 - dist3_std
res4 = dist4 - dist4_std
res5 = dist5 - dist5_std

f, axarr = plt.subplots(2, 2)
axarr[0, 0].plot(res2, 'k-', res2, 'ko', dist2_std, 'r--', ms=3)
axarr[0, 0].set_title('2')
axarr[0, 1].plot(res3, 'k-', res3, 'ko', dist3_std, 'r--', ms=3)
axarr[0, 1].set_title('3')
axarr[1, 0].plot(res4, 'k-', res4, 'ko', dist4_std, 'r--', ms=3)
axarr[1, 0].set_title('4')
axarr[1, 1].plot(res5, 'k-', res5, 'ko', dist5_std, 'r--', ms=3)
axarr[1, 1].set_title('5')


Out[43]:
<matplotlib.text.Text at 0x7f9134df3630>

COnforme o gráfico acima, os pico importantes estão acima da linha tracejada. Então, vou utilizar os residuos como meu critério de separação dos dados.


In [90]:
def split_data(data):
    '''
    Separando os dados por ciclos, utilizando o residuo (dado - desvio_padrao) 
    como critério de seleção. Se a distância for maior que o desvio padrão, temos um novo ciclo
    '''
    delta = dist_module(data)
    
    desvio = np.std(delta)
    residuo = delta - desvio
    ciclo = np.zeros((data.T[1].size,2))
    k = 0
    j = 0
    indices = [] 
    for i in range(len(data.T[1])):
        try:
            
            if residuo[i] < desvio:
                ciclo[i] = data[i]
            elif residuo[i] >= desvio:
                ciclo[i] = data[i]
                k = k+1
				
                j = i + 1
                indices.append(j)
        except IndexError:
            ciclo[i] = data[i]
            k = k + 1
			
    return ciclo, indices

split1, ind1 = split_data(teste1)
split2, ind2 = split_data(teste2)
split3, ind3 = split_data(teste3)
split4, ind4 = split_data(teste4)
split5, ind5 = split_data(teste5)

In [93]:
#Teste de plot para verificar se deu certo a separação
for i in range(len(ind5)):
    try:
        plt.plot(teste5.T[0][ind5[i]:ind5[i+1]], teste5.T[1][ind5[i]:ind5[i+1]])
    except IndexError:
        plt.plot(teste5.T[0][ind5[i]:], teste5.T[1][ind5[i]:])
#Deu certo!


Vou escrever um codigo para separar os dados me baseando nesta ideia. O código esta nesta mesma pasta sob o nome split_data.py


In [ ]:


In [89]:


In [ ]: